home *** CD-ROM | disk | FTP | other *** search
- package com.extensibility.saf.impl;
-
- import com.extensibility.saf.AdjunctException;
- import com.extensibility.saf.Association;
- import com.extensibility.saf.SchemaAdjunct;
- import java.util.StringTokenizer;
- import org.w3c.dom.Attr;
- import org.w3c.dom.Element;
- import org.w3c.dom.Node;
- import org.w3c.dom.Text;
-
- public class GeneralAssociation implements Association, Tags {
- protected Element element;
- protected SchemaAdjunct adjunct;
- protected static final int FIND = 0;
- protected static final int CREATE = 1;
- protected static final int DELETE = 2;
-
- public GeneralAssociation(SchemaAdjunct var1, Element var2) {
- this.adjunct = var1;
- this.element = var2;
- }
-
- public boolean equals(Object var1) {
- if (var1 instanceof GeneralAssociation) {
- GeneralAssociation var2 = (GeneralAssociation)var1;
- return this.element.equals(var2.element);
- } else {
- return false;
- }
- }
-
- public SchemaAdjunct getOwnerAdjunct() {
- return this.adjunct;
- }
-
- public String getSelector() {
- return this.element.getAttribute("which");
- }
-
- public int getKind() {
- if (this.element.getNodeName().equals("document")) {
- return 0;
- } else if (this.element.getNodeName().equals("element")) {
- return 1;
- } else if (this.element.getNodeName().equals("attribute")) {
- return 2;
- } else {
- throw new RuntimeException("invalid association kind");
- }
- }
-
- public Element getMetaData() {
- return this.element;
- }
-
- public String getProperty(String var1) {
- Node var2 = this.findNode(var1, 0);
- if (var2 == null) {
- return null;
- } else if (var2.getNodeType() == 2) {
- return var2.getNodeValue();
- } else {
- StringBuffer var3 = new StringBuffer();
- this.gatherTextContext(var2, var3);
- return var3.toString().trim();
- }
- }
-
- public int countRepeatedProperty(String var1) {
- Node var2 = this.findNode(String.valueOf(var1).concat(String.valueOf("[1]")), 0);
- int var3 = 0;
- if (var2 != null) {
- for(String var4 = var2.getNodeName(); var2 != null; var2 = var2.getNextSibling()) {
- if (var4.equals(var2.getNodeName())) {
- ++var3;
- }
- }
- }
-
- return var3;
- }
-
- protected void gatherTextContext(Node var1, StringBuffer var2) {
- for(Node var3 = var1.getFirstChild(); var3 != null; var3 = var3.getNextSibling()) {
- if (var3.getNodeType() == 3 || var3.getNodeType() == 4) {
- var2.append(var3.getNodeValue());
- }
- }
-
- }
-
- protected void setTextContext(Node var1, String var2) {
- Object var3 = null;
- boolean var4 = false;
-
- for(Node var5 = var1.getFirstChild(); var5 != null; var5 = var7) {
- var7 = var5.getNextSibling();
- if (var5.getNodeType() == 3 || var5.getNodeType() == 4) {
- if (var4) {
- var1.removeChild(var5);
- } else {
- var5.setNodeValue(var2);
- var4 = true;
- }
- }
- }
-
- if (!var4) {
- Text var6 = var1.getOwnerDocument().createTextNode(var2);
- var1.appendChild(var6);
- }
-
- }
-
- protected Node findNode(String var1, int var2) {
- StringTokenizer var3 = new StringTokenizer(var1, "[]/", true);
- return findNode(this.element, var3, var2);
- }
-
- protected static Node findNode(Element var0, StringTokenizer var1, int var2) {
- if (!var1.hasMoreTokens()) {
- if (var2 == 2) {
- Node var8 = var0.getParentNode();
- var8.removeChild(var0);
- }
-
- return var0;
- } else {
- String var3 = var1.nextToken();
- if (var3.equals("/")) {
- return findNode(var0, var1, var2);
- } else if (var3.startsWith("@")) {
- String var9 = var3.substring(1);
- Attr var12 = var0.getAttributeNode(var9);
- if (var12 != null && var2 == 2) {
- var0.removeAttributeNode(var12);
- } else if (var12 == null && var2 == 1) {
- var12 = var0.getOwnerDocument().createAttribute(var9);
- var0.setAttributeNode(var12);
- }
-
- return var12;
- } else {
- int var4 = 0;
- if (var1.hasMoreTokens()) {
- try {
- String var5 = var1.nextToken();
- if (var5.equals("[")) {
- var4 = Integer.parseInt(var1.nextToken());
- var5 = var1.nextToken();
- }
- } catch (Exception var7) {
- throw new AdjunctException("invalid property specification");
- }
- }
-
- Object var11 = null;
-
- for(Node var6 = var0.getFirstChild(); var6 != null; var6 = var6.getNextSibling()) {
- if (var6.getNodeName().equals(var3)) {
- if (var11 != null) {
- if (var4 == 0) {
- throw new AdjunctException("ambiguous property specification");
- }
- } else {
- if (var4 == 1) {
- var11 = findNode((Element)var6, var1, var2);
- break;
- }
-
- if (var4 == 0) {
- var11 = findNode((Element)var6, var1, var2);
- } else {
- --var4;
- }
- }
- }
- }
-
- if (var11 != null && var2 == 2) {
- var0.removeChild((Node)var11);
- } else if (var11 == null && var2 == 1) {
- var11 = var0.getOwnerDocument().createElement(var3);
- var0.appendChild((Node)var11);
- if (var1.hasMoreTokens()) {
- var11 = findNode((Element)var11, var1, var2);
- }
- }
-
- return (Node)var11;
- }
- }
- }
-
- public void setProperty(String var1, String var2) {
- Node var3 = this.findNode(var1, 1);
- if (var3.getNodeType() == 2) {
- var3.setNodeValue(var2);
- } else {
- this.setTextContext(var3, var2);
- }
-
- }
-
- public void removeProperty(String var1) {
- this.findNode(var1, 2);
- }
- }
-